#include<bits/stdc++.h>
#define rg register
#define file(x)freopen(x".in","r",stdin);freopen(x".out","w",stdout)

using namespace std;

const int maxn=1e6+10;

int n,Q;
char S[maxn];
int sum[maxn];

namespace SGT{
	int Max[maxn<<2],Lazy[maxn<<2];
	inline void pushup(int node){Max[node]=max(Max[node<<1],Max[node<<1|1]);}
	inline void build(int node,int l,int r)
	{
		if(l==r)
		{
			Max[node]=sum[l];
			return;
		}
		int mid=(l+r)>>1;
		build(node<<1,l,mid);
		build(node<<1|1,mid+1,r);
		pushup(node);
	}
	inline void Add(int node,int V)
	{
		Max[node]+=V,Lazy[node]+=V;
	}
	inline void pushdown(int node)
	{
		if(Lazy[node]==0)return;
		Add(node<<1,Lazy[node]);
		Add(node<<1|1,Lazy[node]);
		Lazy[node]=0;
	}
	inline void change(int node,int l,int r,int L,int R,int V)
	{
		if(L<=l&&r<=R)return Add(node,V);
		pushdown(node);
		int mid=(l+r)>>1;
		if(mid>=L)change(node<<1,l,mid,L,R,V);
		if(mid<R)change(node<<1|1,mid+1,r,L,R,V);
		pushup(node);
	}
	inline int Query(int node,int l,int r,int L,int R)
	{
		if(L<=l&&r<=R)return Max[node];
		pushdown(node);
		int mid=(l+r)>>1;
		if(mid>=R)return Query(node<<1,l,mid,L,R);
		if(mid<L)return Query(node<<1|1,mid+1,r,L,R);
		return max(Query(node<<1,l,mid,L,R),Query(node<<1|1,mid+1,r,L,R));
	}
}
int Ans[maxn];
vector<pair<int,int> >Ques[maxn];

namespace BIT{
	int Min[maxn];
	inline void init()
	{
		for(rg int i=1;i<=n+1;i+=1)Min[i]=(int)1e9;
	}
	inline void add(int x,int V)
	{
		for(++x;x<=n+1;x+=x&(-x))Min[x]=min(Min[x],V);
	}
	inline int Query(int x)
	{
		int re=(int)1e9;
		for(++x;x;x-=x&(-x))re=min(re,Min[x]);
		return re;
	}
}

int main()
{
	file("good");
	scanf("%d %d",&n,&Q);
	scanf("%s",S+1);
	for(rg int i=1;i<=n;i+=1)sum[i]=sum[i-1]+(S[i]=='1'?1:-1);
	for(rg int i=1;i<=Q;i+=1)
	{
		int l,r;scanf("%d %d",&l,&r);
		Ques[l-1].emplace_back(r,i);
		Ans[i]=sum[l-1]-sum[r];
	}
	static int Stack[maxn];int top=0;
	SGT::build(1,0,n);
	Stack[top=0]=n+1;
	BIT::init();
	for(rg int i=n;i>=0;i-=1)
	{
		while(top&&sum[Stack[top]]>=sum[i])
		{
			SGT::change(1,0,n,Stack[top],Stack[top-1]-1,sum[Stack[top]]);
			top-=1;
		}
		SGT::change(1,0,n,i,Stack[top]-1,-sum[i]);
		Stack[++top]=i;
		BIT::add(i,sum[i]);
		for(auto [r,qid]:Ques[i])
		{
			bool flag=BIT::Query(r)<sum[i];
			Ans[qid]+=max(flag?1:0,SGT::Query(1,0,n,i,r));
		}
	}
//	for(rg int i=1;i<=Q;i+=1)cout<<Ans[i]<<endl;cout<<endl;
	int re=0;
	for(rg int i=1;i<=Q;i+=1)re^=Ans[i];
	printf("%d\n",re);
	return 0;
}
